////////////////////////////////////////////////////////////////////////////////

#ifndef _SERVER_NETWORK_H_
#define _SERVER_NETWORK_H_

////////////////////////////////////////////////////////////////////////////////

#include <list>
#include <boost/asio.hpp>

////////////////////////////////////////////////////////////////////////////////

#include "server_session.h"

////////////////////////////////////////////////////////////////////////////////

class Server;
struct ServerPacket;
struct ClientPacket;


/** Game server network manager
*
*   Based on Boost.Asio cross-platform C++ library
*
*  @author   Roman Pasechnik
*  @since    Jun 11th, 2009
*  @updated  Jun 11th, 2009
*/
class ServerNetwork
{
////////////////////////////////////////////////////////////////////////////////

public:

////////////////////////////////////////////////////////////////////////////////


    /** Constructor */
    ServerNetwork( int _port, boost::asio::io_service& _io_service );


    /** Destructor */
    virtual ~ServerNetwork();


    /** Start server network */
    void Start( Server* _coordinator );


    /** Send packet to all clients */
    void Send( const ServerPacket& _packet );


////////////////////////////////////////////////////////////////////////////////

private:

////////////////////////////////////////////////////////////////////////////////


    /** IO service object */
    boost::asio::io_service& m_io_service;


    /** TCP acceptor */
    tcp::acceptor m_Acceptor;


    /** [Utility type]: List of server sessions */
    typedef std::list<ServerSession*> ServerSessions;


    /** Server sessions */
    ServerSessions m_Sessions;


    /** Server interface */
    Server* m_Server;


////////////////////////////////////////////////////////////////////////////////


    /** Start accepting incoming connections */
    void StartAccept();


    /** Handle accept of incoming connections */
    void HandleAccept( ServerSession* _newSession );


////////////////////////////////////////////////////////////////////////////////
};


////////////////////////////////////////////////////////////////////////////////

#endif

////////////////////////////////////////////////////////////////////////////////

